'use strict';

import axios from 'axios';
import NProgress from 'nprogress';
import { diffTokenTime } from './auth';
import { message } from 'ant-design-vue';
import useApp from '~/N/store/modules/app';

NProgress.configure({ showSpinner: false });

const {  VITE_BASE_URI } = import.meta.env;

console.log(
  `%c 当前请求服务名>>> %c ${VITE_BASE_URI} `,
  'background: #EA5455; border-radius: 3px 0 0 3px; line-height:1.8em; color:#fff',
  'background: #3CD500; border-radius: 0 3px 3px 0; line-height:1.8em; color:#fff'
);

const service = axios.create({
  timeout: 10 * 1000,
  headers: { 'Content-Type': 'application/json;charset=utf-8' }
});

/* 请求拦截器操作 */
service.interceptors.request.use(config => {
  const { method, data } = config;
  const store = useApp();
  NProgress.start();

  // TODO 获取token，并添加其请求头中
  config.headers['token'] = store.token;
  // config.headers.Authorization = 'Bearer ' + tokenAuth;

  // TODO:此处被动退出系统
  if (diffTokenTime() && store.token) {
    useApp().CLEAR_TOKEN(); // 清除缓存
    window.location.reload(); // 刷新浏览器
    message.warning('登录过期，请重新登录!');
  }

  if (method.toUpperCase() === 'GET' && data) {
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  }

  if (method.toUpperCase() === 'POST' && data) {
    config.headers['Content-Type'] = 'multipart/form-data';
  }

  // 加上取消请求
  config.cancelToken = new axios.CancelToken((cancel) => {
    if (Array.isArray(window.axiosCancelTokenList)) {
      window.axiosCancelTokenList.push(cancel);
    } else {
      window.axiosCancelTokenList = [cancel];
    }
  });

  return config;
}, error => {
  console.error(error);
  return Promise.reject(error);
});

/* 响应拦截器操作 */
service.interceptors.response.use(response => {
  // 解析响应数据
  const { status, statusText, headers, data } = response;

  // TODO 若返回二进制数据，则不做处理
  if (['blob', 'arraybuffer'].includes(response.request.responseType)) return data;

  if (status === 200) {

    // TODO 根据状态码判断
    // eg：登录超时，登录失败，重复登录
    // window.location.reload();

    if (!data) {
      message.error(data.msg || '服务器开小差，请稍后再试!!');
      return;
    }

    const DATA = {
      message: data && data.msg,
      status: data && data.status
    };

    if (data &&
      (data.data !== null ||
        data.data !== 'null' ||
        data.data !== undefined ||
        data.data !== 'undefined'
      )) {
      DATA.data = data.data;
    }

    // 返回处理后数据
    const resData = {
      status,
      statusText,
      headers,
      data: DATA
    };

    NProgress.done();

    return Promise.resolve(resData);
  } else {
    message.error(data.msg);
    return Promise.reject(new Error(response));
  }
}, error => {

  // TODO 断网情况，刷新重新获取数据
  if (!window.navigator.onLine) {
    message.error('请检查网络，重新刷新页面！');
    return false;
  } else {
    // TODO 错误处理
    if (error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
      message.error('服务器响应，请求超时！');
      return false;
    }

    if (error && error.response) {
      const { status, data } = error.response;
      console.log(error, '>>>');
      console.log(data);
      console.log(status);
      message.error(data);
    }

    /*
      error.response.status
      400:错误请求
      401:未授权，请重新登录 [认证失败，无法访问系统资源]
      403:拒绝访问 [当前操作没有权限]
      404:未找到资源 [访问资源不存在]
      405:请求方法错误
      408:请求超时
      500:服务器出错
      501:网络未实现
      502:网络错误
      503:服务不可用
      504:网络超时
      505:http版本不支持该请求
      default:连接错误 [系统未知错误，请反馈给管理员]
    */

    // if (JSON.stringify(error).includes('timeout')) {
    //   ElMessage.error('服务器端响应超时');
    // } else if (error.message === 'Network Error') {
    //   ElMessage.error('网络连接错误');
    // } else if (error.response.data) {
    //   ElMessage.error(error.response.statusText);
    // }

    NProgress.done();

    return Promise.reject(new Error(error));

    // 当前页面已失效，请重新登录
    // window.location.href = '/'; // 跳转登录页
  }
}
);

export default service;
